#include <iostream>
using namespace std;

class A {
  int *pa; // 私有成员，派生类无法访问，所以派生类析构函数必须隐式调用基类析构函数。
public:
  A() : pa(new int[1]) {};
  virtual ~A() { delete[] pa; cout << "A::Dtor" << endl; }
};

extern A* create(); // 函数声明。定义在另一个CPP文件中。

int main() {
  A *p = create(); // 无法确定返回对象的实际类型。可能是A、也可能是A的派生类。
  delete p; // 所以析构函数必须“能”定义成虚函数，以便用基类指针完整删除对象。
            // 并且拥有资源时析构函数应当定义成虚的。
}

////////////////////

class B : public A { // 在另一个文件里定义了B类和create函数
  int *pb; // 私有成员，不可能被基类访问。所以析构函数必须“能”定义成虚函数。
public:
  B() : pb(new int[2]) {};
  virtual ~B() { delete[] pb; cout << "B::Dtor" << endl; }
};

A* create() { return new B(); }
